static unsigned int __read_mostly irq_ratelimit_threshold = 10000;
integer_param("irq_ratelimit", irq_ratelimit_threshold);
-int check_irq_status(int irq)
-{
- return irq_status[irq] != IRQ_UNUSED ? 1 : 0;
-}
-
/* Must be called when irq disabled */
void lock_vector_lock(void)
{
desc->status &= ~IRQ_DISABLED;
desc->handler->startup(irq);
- if ( !check_irq_status(irq) )
- irq_status[irq] = IRQ_USED;
-
spin_unlock_irqrestore(&desc->lock,flags);
return 0;
ASSERT(spin_is_locked(&pcidevs_lock));
ASSERT(spin_is_locked(&d->event_lock));
-
- desc = irq_to_desc(irq);
if ( !IS_PRIV(current->domain) &&
!(IS_PRIV_FOR(current->domain, d) &&
return -EINVAL;
}
- if ( desc->action )
- {
- dprintk(XENLOG_G_WARNING, "Attempt to map in-use IRQ by Xen,"
- " irq:%d!\n", irq);
- return 0;
- }
-
old_irq = domain_pirq_to_irq(d, pirq);
old_pirq = domain_irq_to_pirq(d, irq);
return ret;
}
+ desc = irq_to_desc(irq);
if ( type == MAP_PIRQ_TYPE_MSI )
{
static int physdev_map_pirq(struct physdev_map_pirq *map)
{
struct domain *d;
- int pirq = 0, irq, ret = 0;
+ int pirq, irq, ret = 0;
struct msi_info _msi;
void *map_data = NULL;
switch ( map->type )
{
case MAP_PIRQ_TYPE_GSI:
- {
- int gsi, triggering, polarity;
-
- gsi = map->index & 0xffff;
- triggering = !!(map->index & (1 << 16));
- polarity = !!(map->index & (1 << 24));
- irq = pirq = map->pirq;
-
- if ( gsi < 0 || gsi >= nr_irqs_gsi )
+ if ( map->index < 0 || map->index >= nr_irqs_gsi )
{
- dprintk(XENLOG_G_ERR, "dom%d: map invalid gsi %d\n",
- d->domain_id, gsi);
+ dprintk(XENLOG_G_ERR, "dom%d: map invalid irq %d\n",
+ d->domain_id, map->index);
ret = -EINVAL;
goto free_domain;
}
- if ( !check_irq_status(irq) ) {
- mp_register_gsi(gsi, triggering, polarity);
- printk("Register gsi:%d for dom:%d, irq:%d\n", gsi,
- d->domain_id, irq);
+ irq = domain_pirq_to_irq(current->domain, map->index);
+ if ( !irq )
+ {
+ dprintk(XENLOG_G_ERR, "dom%d: map pirq with incorrect irq!\n",
+ d->domain_id);
+ ret = -EINVAL;
+ goto free_domain;
}
break;
- }
+
case MAP_PIRQ_TYPE_MSI:
irq = map->index;
if ( irq == -1 )
spin_lock(&pcidevs_lock);
/* Verify or get pirq. */
spin_lock(&d->event_lock);
+ pirq = domain_irq_to_pirq(d, irq);
if ( map->pirq < 0 )
{
if ( pirq )